package com.beetlestech.nfe.main.biz.com.impl;

import java.sql.Time;
import java.util.Date;

import com.beetlestech.nfe.fw.core.biz.AbstractDBLogic;
import com.beetlestech.nfe.fw.core.type.AutoInject;
import com.beetlestech.nfe.fw.core.util.StringUtil;
import com.beetlestech.nfe.main.biz.com.HbAuthentication;
import com.beetlestech.nfe.main.biz.com.HbComblcmMaster;
import com.beetlestech.nfe.main.biz.com.HbLogin;
import com.beetlestech.nfe.main.biz.com.HbUser;
import com.beetlestech.nfe.main.biz.com.dto.UserInfoDTO;
import com.beetlestech.nfe.main.biz.constant.CommonConstant;
import com.beetlestech.nfe.main.biz.constant.CtgCodeConstant;
import com.beetlestech.nfe.main.biz.constant.HbMessageCode;
import com.beetlestech.nfe.main.db.base.StatementDTO;
import com.beetlestech.nfe.main.db.base.StatementUtil;
import com.beetlestech.nfe.main.db.tbl.ApploginlgDTO;
import com.beetlestech.nfe.main.db.tbl.CoursetrialDTO;
import com.beetlestech.nfe.main.db.tbl.TloginlgDTO;

/**
 * ログイン Bizロジックの実装ロジック
 *
 * 変更履歴 REV. 変更日付 変更者 変更内容 ------- --------------- ----------------
 * ------------------ 1.0 2014/02/26 GD 王昕 新規作成 1.1 2014/03/06 GD 賈博 欠陥管理No344対応
 */
public class HbLoginImpl extends AbstractDBLogic implements HbLogin, HbMessageCode, CommonConstant, CtgCodeConstant {

	/**
	 * APPL_ID:COM
	 */
	protected static final String APPL_ID_COM = "COM";
	/**
	 * FUNCTION_ID:MODE
	 */
	protected static final String FUNCTION_ID_MODE = "Mode";
	/**
	 * ITEM_ID:AUTHEBTICATION_TYPE
	 */
	protected static final String ITEM_ID_AUTHENTICATION_TYPE = "AuthenticationType";
	/**
	 * ITEM_ID_LOGINUSERID_MODE
	 */
	protected static final String ITEM_ID_LOGINUSERID_MODE = "LoginUserIdMode";
	/**
	 * ログインIDまたはパスワード
	 */
	protected static final String SH_IDPASS = "ログインIDまたはパスワード";
	/**
	 * パスワード
	 */
	protected static final String SH_PASS = "パスワード";
	/**
	 * 認証タイプ:0
	 */
	protected static final String TYPE_CIS = "0";
	/**
	 * 認証タイプ:1
	 */
	protected static final String TYPE_LDAP = "1";
	/**
	 * ビジネスロジック設定マスター情報を取得 Bizロジック
	 */
	@AutoInject
	protected HbComblcmMaster hbComblcmMaster;
	/**
	 * ビジネスロジック設定マスター情報を取得 Bizロジック
	 */
	@AutoInject
	protected HbAuthentication hbAuthentication;
	/**
	 * ユーザー情報 Bizロジック
	 */
	@AutoInject
	protected HbUser hbUser;

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.beetlestech.nfe.main.biz.com.HbLogin#login(java.lang.String,
	 * java.lang.String, java.lang.String)
	 */
	@Override
	public Boolean login(String loginName, String password, String sesID) {
		Boolean loginResult = false;
		/*
		 * // 職員ID String shId = EMPTY; // IPアドレスを取得する String ipAddress =
		 * getIpAddress(); //
		 * HbComblcmMasterクラスのgetComblcmInfoメソッドより、「認証タイプ」を取得する。 TcomblcmDTO
		 * authenticationType = hbComblcmMaster.getComblcmInfo(APPL_ID_COM,
		 * FUNCTION_ID_MODE, ITEM_ID_AUTHENTICATION_TYPE);
		 * 
		 * // 共通メソッドを呼び出して、「ログインIDの種類」を取得する TcomblcmDTO loginUserIdMode =
		 * hbComblcmMaster.getComblcmInfo(APPL_ID_COM, FUNCTION_ID_MODE,
		 * ITEM_ID_LOGINUSERID_MODE);
		 */
		// 共通メソッドを呼び出して、「職員基本情報」を取得する
		UserInfoDTO employeeDTO = hbUser.getLoginUserInfo(loginName, password, sesID);

		if (employeeDTO == null) {
			createApplicationException(M00010WC);
		} else if (employeeDTO.getpassword().equals(password)) {
			createSession(employeeDTO.getusrid().toString(), employeeDTO);
			loginResult = true;
		} else {
			createApplicationException(M10170WS, SH_IDPASS);
		}

		/*
		 * AuthResultDTO authenticationResult = new AuthResultDTO();
		 * authenticationResult.setAuthresult(CtgCodeConstant.TLOGINLG_RESULT.
		 * LOGIN_FAIL.toString()); if (vstaffm2DTO != null) { if
		 * (TYPE_CIS.equals(StringUtil.trim(authenticationType.getValue()))) {
		 * // 「認証タイプが」"0"(CIS)の場合,共通メソッドを呼び出して、「認証結果」を取得する。
		 * authenticationResult.setAuthresult(hbAuthentication.authenticate(
		 * loginId, password, vstaffm2DTO)); } else if
		 * (TYPE_LDAP.equals(StringUtil.trim(authenticationType.getValue()))) {
		 * // 「認証タイプが」"1"(LDAP)の場合,共通メソッドを呼び出して、「認証結果」を取得する。
		 * authenticationResult = hbAuthentication.authenticateLDAP(loginId,
		 * password); }
		 * 
		 * // 職員IDを取得 shId = vstaffm2DTO.getShId(); }
		 * 
		 * // 共通メソッドを呼び出して、「wsNo」を取得する。 String wsNo =
		 * hbworkstationprofile.getWsInfo(hostName, ipAddress); //
		 * 共通メソッドを呼び出して、「ログを」を記述する。 recordLogin(loginId, shId,
		 * authenticationResult.getAuthresult(), wsNo, ipAddress, hostName,
		 * getSessionId());
		 * 
		 * // 「認証可否」結果が"0"（認証成功）の場合パスワードの有効期限間近か確認する。 if
		 * ((CtgCodeConstant.TLOGINLG_RESULT.LOGIN_SUCCESS.toString()).equals(
		 * StringUtil.trim(authenticationResult.getAuthresult()))) {
		 * PwExpirationInfoDTO pwexpirationinfoLdap =
		 * hbAuthentication.notifyPwExpDate(vstaffm2DTO); createSession(loginId,
		 * vstaffm2DTO.getShId(), vstaffm2DTO); // 「例外処理」 //
		 * 1で取得した「認証タイプ」＝「TYPE_LDAP」の場合、以下を行う認証可否結果が"0"(認証成功)かつ2.
		 * 2のパスワード期限情報のチェック結果がFalseの場合 // 「ApplicationException」を返す。 if
		 * (pwexpirationinfoLdap != null && !pwexpirationinfoLdap.getResult()) {
		 * addApplicationMessage(M10520WS,
		 * pwexpirationinfoLdap.getExpirationYear(),
		 * pwexpirationinfoLdap.getExpirationMonth(),
		 * pwexpirationinfoLdap.getExpirationDay(),
		 * pwexpirationinfoLdap.getDays()); } loginResult = true; } else if
		 * ((CtgCodeConstant.TLOGINLG_RESULT.LOGIN_FAIL.toString()).equals(
		 * StringUtil.trim(authenticationResult.getAuthresult()))) {
		 * createApplicationException(M10170WS, SH_IDPASS); } else if
		 * ((CtgCodeConstant.TLOGINLG_RESULT.NOT_UPDATE.toString()).equals(
		 * StringUtil.trim(authenticationResult.getAuthresult()))) {
		 * createSession(loginId, vstaffm2DTO.getShId(), vstaffm2DTO);
		 * createApplicationException(M10530WS); } else if
		 * ((CtgCodeConstant.TLOGINLG_RESULT.EXPIRED.toString()).equals(
		 * StringUtil.trim(authenticationResult.getAuthresult()))) {
		 * createSession(loginId, vstaffm2DTO.getShId(), vstaffm2DTO);
		 * createApplicationException(M10180WS, SH_PASS); }
		 */

		return loginResult;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.beetlestech.nfe.main.biz.com.HbLogin#createSession(java.lang.String,
	 * java.lang.String, com.beetlestech.nfe.main.db.view.Vstaffm2DTO)
	 */
	@Override
	public void createSession(String loginId, UserInfoDTO staffInfo) {
		// セッション情報を格納する
		// セッションに、入力値「ユーザ情報」を格納する。
		setUserInfo(staffInfo);

		// セッションに、入力値「ログインID」を格納する。
		setLoginId(loginId);

		// セッションに、入力値「ユーザID」を格納する。
		setUserId(String.valueOf(loginId));
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.beetlestech.nfe.main.biz.com.HbLogin#recordLogin(java.lang.String,
	 * java.lang.String, java.lang.String, java.lang.String, java.lang.String,
	 * java.lang.String, java.lang.String)
	 */
	@Override
	public void recordLogin(String loginId, String shId, String result, String wsNo, String ipAddress, String hostName,
			String sessionId) {
		// ログイン情報を設定する
		TloginlgDTO tloginlgDTO = TloginlgDTO.setDefaultValue();
		tloginlgDTO.setLoginId(loginId);
		tloginlgDTO.setShId(shId);
		tloginlgDTO.setEventDate(getCurrentDate());
		tloginlgDTO.setEventTime(getCurrentTime());
		tloginlgDTO.setResult(result);
		tloginlgDTO.setWsNo(wsNo);
		if (StringUtil.isNotEmpty(ipAddress)) {
			tloginlgDTO.setIpAddress(ipAddress);
		}
		if (StringUtil.isNotEmpty(hostName)) {
			tloginlgDTO.setHostName(hostName);
		}
		tloginlgDTO.setSessionId(sessionId);
		// LOGONLGにログイン情報を挿入する
		updateDAO.updateImmediately(TloginlgDTO.INSERT, tloginlgDTO);
	}

	@Override
	public String getSessionID(String userID) {
		String sesID = "";
		StatementDTO statementDTO = new StatementDTO();
		StatementUtil.andWhere(statementDTO, TloginlgDTO.COLUMN_LOGIN_ID, StatementUtil.KEYWORD.EQUAL, userID);
		TloginlgDTO searchDTO = new TloginlgDTO();
		searchDTO.set_dynamicWhereCondition(statementDTO.getSQLStatement());
		TloginlgDTO tlDB = queryDAO.queryForObject(TloginlgDTO.SQL_SEARCH, searchDTO);

		if (tlDB != null) {
			sesID = tlDB.getSessionId();
		}
		return sesID;
	}

	@Override
	public String getUserId(String sesID) {
		String userID = "";
		StatementDTO statementDTO = new StatementDTO();
		StatementUtil.andWhere(statementDTO, TloginlgDTO.COLUMN_SESSION_ID, StatementUtil.KEYWORD.EQUAL, sesID);
		ApploginlgDTO searchDTO = new ApploginlgDTO();
		searchDTO.set_dynamicWhereCondition(statementDTO.getSQLStatement());
		ApploginlgDTO tlDB = queryDAO.queryForObject(ApploginlgDTO.SQL_SEARCH, searchDTO);
// 登录有限期改为一直有效，暂不需要登录时间验证
		if (tlDB != null) {
//			java.sql.Date date = tlDB.getEventDate();
//			java.sql.Time time = tlDB.getEventTime();
//			java.util.Date loginTime = new java.util.Date(date.getTime() + time.getTime());
//			long day = (new java.util.Date().getTime() - loginTime.getTime()) / (1000 * 60 * 60 * 24);
//			if (day < 14.0) {
				userID = tlDB.getLoginId();
//			}
		}
		return userID;
	}
}
